package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ItemCatServiceImpl implements ItemCatService{
    @Autowired
    private ItemCatMapper itemCatMapper;


    @Override
    public void updateStatus(ItemCat itemCat) {
          itemCatMapper.updateById(itemCat);
    }

    @Override
    public void saveItemCat(ItemCat itemCat) {
        itemCatMapper.insert(itemCat);
    }

    @Override
    @Transactional
    public void deleteItemCat(ItemCat itemCat) {
        Integer level=itemCat.getLevel();
        if(level==3)
        {
            itemCatMapper.deleteById(itemCat.getId());
        }
        else if(level==2)//查找所有parentId为二级商品id的三级商品将其删除
        {
//            QueryWrapper<ItemCat> queryWrapper=new QueryWrapper<>();
//            queryWrapper.eq("parent_id", itemCat.getId());
//            List<ItemCat> threeList=itemCatMapper.selectList(queryWrapper);
//            for (ItemCat itemCat3:threeList) {
//                itemCatMapper.deleteById(itemCat3.getId());
//            }
//            itemCatMapper.deleteById(itemCat.getId());
            //先删除三级
            QueryWrapper<ItemCat> queryWrapper=new QueryWrapper<>();
            queryWrapper.eq("parent_id", itemCat.getId());
            itemCatMapper.delete(queryWrapper);
            //再删除二级
            itemCatMapper.deleteById(itemCat.getId());
        }
        else if(level==1)//当删除一级类别商品时,1.应该先删除二级商品的子类--三级商品的信息,2.然后删除二级信息,3.最后删除一级信息
        {
//            QueryWrapper<ItemCat> queryWrapper=new QueryWrapper<>();
//            queryWrapper.eq("parent_id", itemCat.getId());
//            List<ItemCat> twoList=itemCatMapper.selectList(queryWrapper);
//            for (ItemCat itemCat2:twoList) {
//                queryWrapper.clear();
//                queryWrapper.eq("parent_id", itemCat2.getId());
//                List<ItemCat> threeList=itemCatMapper.selectList(queryWrapper);
//                for (ItemCat itemCat3:threeList) {
//                    itemCatMapper.deleteById(itemCat3.getId());
//                }
//                itemCatMapper.deleteById(itemCat2.getId());
//            }
//            itemCatMapper.deleteById(itemCat.getId());
            List<Integer> ids=new ArrayList<>();
            QueryWrapper<ItemCat> queryWrapper=new QueryWrapper<>();
            queryWrapper.eq("parent_id", itemCat.getId());
            List<ItemCat> twoList=itemCatMapper.selectList(queryWrapper);
            for (ItemCat itemCat2:twoList) {
                queryWrapper.clear();
                queryWrapper.eq("parent_id", itemCat2.getId());
                itemCatMapper.delete(queryWrapper);
//                itemCatMapper.deleteById(itemCat2.getId());
                ids.add(itemCat2.getId());
            }
            itemCatMapper.deleteBatchIds(ids);//改进
            itemCatMapper.deleteById(itemCat.getId());
        }
    }

    @Override
    @Transactional
    public void updateItemCat(ItemCat itemCat) {
          itemCatMapper.updateById(itemCat);
    }

    /**
     * —级菜单
     * children----->二级菜单信息
     *                children------->三级菜单信息
     */
    @Override
    public List<ItemCat> findItemCatList(Integer level) {
        Map<Integer,List<ItemCat>> map=getItemCatMap();
        if(level == 1) return map.get(0);
        if(level == 2) return findTwoItemCatList(map);
        return findThreeItemCatList(map);
    }

    private List<ItemCat> findThreeItemCatList(Map<Integer, List<ItemCat>> map) {
        List<ItemCat> twoList=findTwoItemCatList(map);
        for(ItemCat itemCat:twoList)
        {
            if(itemCat.getChildren()!=null)
            {
                for(ItemCat itemCat2:itemCat.getChildren())
                {
                    List<ItemCat> threeList=map.get(itemCat2.getId());
                    itemCat2.setChildren(threeList);
                }
            }
        }
        return twoList;
    }

    private List<ItemCat> findTwoItemCatList(Map<Integer, List<ItemCat>> map) {
        //1.获取一级商品分类
        List<ItemCat> oneList=map.get(0);
        //2.根据一级查询二级商品
        for(ItemCat  itemCat:oneList){
            List<ItemCat> twoList=map.get(itemCat.getId());
            itemCat.setChildren(twoList);
        }
        return oneList;
    }

    private Map<Integer, List<ItemCat>> getItemCatMap() {
        List<ItemCat> itemCatList =itemCatMapper.selectList(null);
        Map<Integer,List<ItemCat>> map=new HashMap<>();
        for(ItemCat itemCat : itemCatList)
        {
            Integer parentId=itemCat.getParentId();
            if(map.containsKey(parentId))//该商品有父类
            {
                map.get(parentId).add(itemCat);
            }else{//该商品没有父类  将自己加入到一个List集合中
                List<ItemCat> list=new ArrayList<>();
                list.add(itemCat);
                map.put(parentId, list);
            }
        }
        return map;
    }



    //1.方法1
//    @Override
//    public List<ItemCat> findItemCatList(Integer level) {
//        //1.查询一级对象列表
//         QueryWrapper<ItemCat> queryWrapper=new QueryWrapper<>();
//         queryWrapper.eq("parent_id", 0);
//         List<ItemCat> oneList=itemCatMapper.selectList(queryWrapper);
//
//         //2.
//        for (ItemCat itemCat:oneList) {
//            queryWrapper.clear();
//            queryWrapper.eq("parent_id", itemCat.getId());
//            List<ItemCat> twoList=itemCatMapper.selectList(queryWrapper);
//             //3.
//            for (ItemCat itemCat2: twoList) {
//                queryWrapper.clear();
//                queryWrapper.eq("parent_id", itemCat2.getId());
//                List<ItemCat> threeList=itemCatMapper.selectList(queryWrapper);
//                itemCat2.setChildren(threeList);
//            }
//            itemCat.setChildren(twoList);
//        }
//        return oneList;
//    }
}
